package com.becca.cake.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 有关字符串处理的工具类。
 * 
 * <p>
 * 这个类中的每个方法都可以“安全”地处理<code>null</code>，而不会抛出<code>NullPointerException</code>。
 * </p>
 *
 * @author chen.zhao
 * @version $Id: StringUtil.java 1149 20011-06-1 02:01:41Z chen.zhao $
 */
public class StringUtil {
    /* ============================================================================ */
    /*  常量和singleton。                                                           */
    /* ============================================================================ */

    /** 空字符串。 */
    public static final String EMPTY_STRING = "";

    /* ============================================================================ */
    /*  判空函数。                                                                  */
    /*                                                                              */
    /*  以下方法用来判定一个字符串是否为：                                          */
    /*  1. null                                                                     */
    /*  2. empty - ""                                                               */
    /*  3. blank - "全部是空白" - 空白由Character.isWhitespace所定义。              */
    /* ============================================================================ */

    /**
     * 检查字符串是否为<code>null</code>或空字符串<code>""</code>。
     * <pre>
     * StringUtil.isEmpty(null)      = true
     * StringUtil.isEmpty("")        = true
     * StringUtil.isEmpty(" ")       = false
     * StringUtil.isEmpty("bob")     = false
     * StringUtil.isEmpty("  bob  ") = false
     * </pre>
     *
     * @param str 要检查的字符串
     *
     * @return 如果为空, 则返回<code>true</code>
     */
    public static boolean isEmpty(String str) {
        return ((str == null) || (str.length() == 0));
    }

    /**
     * 检查字符串是否不是<code>null</code>和空字符串<code>""</code>。
     * <pre>
     * StringUtil.isEmpty(null)      = false
     * StringUtil.isEmpty("")        = false
     * StringUtil.isEmpty(" ")       = true
     * StringUtil.isEmpty("bob")     = true
     * StringUtil.isEmpty("  bob  ") = true
     * </pre>
     *
     * @param str 要检查的字符串
     *
     * @return 如果不为空, 则返回<code>true</code>
     */
    public static boolean isNotEmpty(String str) {
        return ((str != null) && (str.length() > 0));
    }

    /**
     * 检查字符串是否是空白：<code>null</code>、空字符串<code>""</code>或只有空白字符。
     * <pre>
     * StringUtil.isBlank(null)      = true
     * StringUtil.isBlank("")        = true
     * StringUtil.isBlank(" ")       = true
     * StringUtil.isBlank("bob")     = false
     * StringUtil.isBlank("  bob  ") = false
     * </pre>
     *
     * @param str 要检查的字符串
     *
     * @return 如果为空白, 则返回<code>true</code>
     */
    public static boolean isBlank(String str) {
        int length = str.length();

        if ((str == null) || (length == 0)) {
            return true;
        }

        for (int i = 0; i < length; i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return false;
            }
        }

        return true;
    }

    /**
     * 检查字符串是否不是空白：<code>null</code>、空字符串<code>""</code>或只有空白字符。
     * <pre>
     * StringUtil.isBlank(null)      = false
     * StringUtil.isBlank("")        = false
     * StringUtil.isBlank(" ")       = false
     * StringUtil.isBlank("bob")     = true
     * StringUtil.isBlank("  bob  ") = true
     * </pre>
     *
     * @param str 要检查的字符串
     *
     * @return 如果为空白, 则返回<code>true</code>
     */
    public static boolean isNotBlank(String str) {
        int length = str.length();

        if ((str == null) || (length == 0)) {
            return false;
        }

        for (int i = 0; i < length; i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return true;
            }
        }

        return false;
    }

    /**
     * 校验是不是全部是数字
     * @param str
     * @return
     */
    public static boolean isNumber(String str) {
        Pattern pattern = java.util.regex.Pattern.compile("[0-9]*");
        Matcher match = pattern.matcher(str);
        if (!match.matches()) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 过滤掉空格，制表符，换行，回车
     * 
     * @param str
     * @return
     */
    public static String replaceBlank(String str) {
        String dest = "";
        if (StringUtil.isNotEmpty(str)) {
            Pattern p = Pattern.compile("\\s*|\t|\r|\n");
            Matcher m = p.matcher(str);
            dest = m.replaceAll("");
        }

        return dest;
    }

    /**
     * NULL 转换为 String
     * 
     * @author zhaoyingfei
     * @date Nov 7, 2013
     * @param str
     * @param param
     * @return
     */
    public static String nullToString(String str, String param) {
        if (null == str) {
            str = param;
        } else {
            if (str.equals("")) {
                str = param;
            }
        }

        return str;
    }

    /**
     * NULL 转换为 Integer
     * 
     * @author zhaoyingfei
     * @date Nov 7, 2013
     * @param str
     * @param param
     * @return
     */
    public static Integer nullToInteger(String str, Integer param) {
        Integer res = 0;
        if (null != str && !str.equals("")) {
            res = Integer.valueOf(str);
        }
        if (null == str) {
            res = param;
        } else {
            if (str.equals("")) {
                res = param;
            }
        }

        return res;
    }

    /**
     * NULL 转换为 Long
     * 
     * @author zhaoyingfei
     * @date Nov 7, 2013
     * @param str
     * @param param
     * @return
     */
    public static Long nullToLong(String str, Integer param) {
        Long res = Long.valueOf(0);
        if (null != str && !str.equals("")) {
            res = Long.valueOf(str);
        }
        if (null == str) {
            res = Long.valueOf(param);
        } else {
            if (str.equals("")) {
                res = Long.valueOf(param);
            }
        }

        return res;
    }

    /**
     * 根据特定分隔符来把Id字符串转换成Long型数组
     * 
     * @author Lionry
     * @date 2013-11-12
     * @param totalStr
     * @param strSplits
     * @return
     */
    public static List<Long> StringToListLong(String[] totalStr, String strSplits) {
        if (totalStr != null) {
            List<Long> list = new ArrayList<Long>();
            String[] totalSplits = null;
            for (String str : totalStr) {
                if (str != null && !"".equals(str)) {
                    totalSplits = str.split(strSplits);
                    for (String spli : totalSplits) {
                        try {
                            list.add(Long.parseLong(spli));
                        } catch (Exception e) {
                            System.out.println("数字非法");
                        }
                    }
                }
            }
            if (list.size() == 0) {
                return null;
            }
            return list;
        } else {
            return null;
        }
    }

    /**
     * 
     *
     * @author Lionry
     * 2013-11-21
     * @param name
     * @return
     */
    public static String StringToSqlLike(String name) {
        if (null == "") {
            return "";
        }
        StringBuffer buffer = new StringBuffer("%");
        for (int i = 0; i < name.length(); i++) {
            buffer.append(name.charAt(i) + "%");
        }
        return buffer.toString();
    }

    /**
     * 参数合成
     * @author Lionry
     * @param list
     * @param splits
     * @return
     */
    public static String ListLongToStringParam(List<Long> list, String splits) {
        if (list != null && list.size() != 0) {
            StringBuffer buffer = new StringBuffer("");
            for (Long lo : list) {
                buffer.append(splits + lo);
            }
            return buffer.toString();
        }
        return null;
    }

    /**
     * 正则校验是否为有效手机号码
     * @param phone
     * @return
     */
    public static boolean isMobileTel(String phone) {
        Pattern p = Pattern.compile("^((13[0-9])|(15[0-9])|(17[0-9])|(18[0-9]))\\d{8}$");
        Matcher m = p.matcher(phone);
        return m.matches();
    }
}
